/*!
 * # 参数列表实体类:
 *  Demand - 执行权限检查
 * 
 * # 描述:
 *  验证当前用户是否对目标功能拥有权限。
 *  
 *  Copyright (c), 上海沃恩信息科技有限公司.
 *  All rights reserved.
 *  Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using Pittypat;

namespace Waln.Authority.Authentication.Args
{
	/// <summary>
	/// 功能 执行权限检查 的参数列表。
	/// </summary>
	[global::Pittypat.Function(Transaction = false)]
	public sealed class Demand : global::Pittypat.FunctionArgs
	{
		#region 构造函数

		/// <summary>
		/// 初始化 Demand 类的一个新实例。
		/// </summary>
		public Demand()
		{
			// 用户令牌
			this.Token = null;
			// 功能路径
			this.Path = null;
			// 是否已授权
			this.Authorized = null;
			// 用户信息
			this.User = null;
		}

		#endregion

		#region 属性

		/// <summary>
		/// 获取或者设置用户令牌。
		/// </summary>
		/// <remarks>
		/// 用户登录令牌。
		/// </remarks>
		[global::Pittypat.Parameter(0, FixedLength = true, MaxLength = 36)]
		public @binary? Token { get; set; }

		/// <summary>
		/// 获取或者设置功能路径。
		/// </summary>
		/// <remarks>
		/// 目标功能的路径，格式为：开发者代码.App标识符.模块标识符.功能标识符。
		/// </remarks>
		[global::Pittypat.Parameter(1, MaxLength = 128)]
		public @string? Path { get; set; }

		/// <summary>
		/// 获取或者设置是否已授权。
		/// </summary>
		/// <remarks>
		/// 指示是否已经授权当前用户访问目标功能。
		/// </remarks>
		[global::Pittypat.Parameter(2, Direction = global::Pittypat.ParameterDirection.Out)]
		public @bool? Authorized { get; set; }

		/// <summary>
		/// 获取或者设置用户信息。
		/// </summary>
		/// <remarks>
		/// 返回当前用户的用户信息。
		/// </remarks>
		[global::Pittypat.Parameter(3, Direction = global::Pittypat.ParameterDirection.Out)]
		public global::Waln.Authority.Authentication.Data.User User { get; set; }

		/// <summary>
		/// 获取或者设置指定名称的参数值。
		/// </summary>
		/// <param name="name">参数名称，不区分大小写。</param>
		/// <returns>目标名称的参数值。如果参数不存在，则返回 null。</returns>
		/// <exception cref="global::System.ArgumentException">设置参数值时发现参数不存在。</exception>
		public override object this[string name]
		{
			get
			{
				if (string.IsNullOrEmpty(name))
				{
					return null;
				}

				switch (name.ToLower())
				{
					case "token":
						return this.Token;
					case "path":
						return this.Path;
					case "authorized":
						return this.Authorized;
					case "user":
						return this.User;
					default:
						return null;
				}
			}
			set
			{
				if (string.IsNullOrEmpty(name))
				{
					throw new global::System.ArgumentException("没有提供有效的参数名称。", "name");
				}

				switch (name.ToLower())
				{
					case "token":
						this.Token = (@binary?)value;
						break;
					case "path":
						this.Path = (@string?)value;
						break;
					case "authorized":
						this.Authorized = (@bool?)value;
						break;
					case "user":
						this.User = (global::Waln.Authority.Authentication.Data.User)value;
						break;
					default:
						throw new global::System.ArgumentException(name + " 不是 " + this.GetType().Name + " 的有效参数名称。", "name");
				}
			}
		}

		#endregion

		#region 方法

		/// <summary>
		/// 将当前对象作为 JSON 字符串写入指定的文本流。
		/// </summary>
		/// <param name="writer">目标文本流。</param>
		/// <exception cref="global::System.ArgumentNullException">writer 是 null。</exception>
		public override void Write(global::System.IO.TextWriter writer)
		{
			if (writer == null)
			{
				throw new global::System.ArgumentNullException("writer");
			}

			writer.Write('{');

			// 用户令牌
			writer.Write("\"token\":");
			this.Token.Write(writer);
			writer.Write(',');

			// 功能路径
			writer.Write("\"path\":");
			this.Path.Write(writer);
			writer.Write(',');

			// 是否已授权
			writer.Write("\"authorized\":");
			this.Authorized.Write(writer);
			writer.Write(',');

			// 用户信息
			writer.Write("\"user\":");
			if (this.User == null)
			{
				writer.Write("null");
			}
			else
			{
				this.User.Write(writer);
			}

			writer.Write('}');
		}

		#endregion
	}
}
